import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeoutException;

public class T1HelloWorld {
    final static String QUEUE_NAME = "hello";
    final static ExecutorService es = Executors.newFixedThreadPool(2);

    public static void main(String[] args) {
        es.submit(() -> {
            try (Connection connection = ConnectionUtil.getConnection();
                 Channel channel = connection.createChannel()) {
                // 创建队列
                // 参数 1：队列名称
                // 参数 2：是否定义持久化队列
                // 参数 3：是否独占本次连接
                // 参数 4：是否在不使用的时候自动删除队列
                // 参数 5：队列其它参数
                channel.queueDeclare(QUEUE_NAME, false, false, false, null);
                String message = "Hello World!";
                while (true) {
                    Thread.sleep(1000);
                    // 发送消息
                    // 参数 1：交换机名称，如果没有指定则使用默认 Default Exchage
                    // 参数 2：路由 key，简单模式可以传递队列名称
                    // 参数 3：消息属性
                    // 参数 4：消息内容
                    channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
                    System.out.println(Thread.currentThread().getName() + " [x] Sent '" + message + "'");
                }
            } catch (IOException | TimeoutException | InterruptedException e) {
                e.printStackTrace();
            }
        });
        es.submit(() -> {
            try {
                Connection connection = ConnectionUtil.getConnection();
                Channel channel = connection.createChannel();
                DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                    String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
                    System.out.println(Thread.currentThread().getName() + " [x] Received '" + message + "'");
                };
                // 订阅消息
                // 爹数 1：队列名称
                // 参数 2：是否自动确认。设置为 true 表示消息按收到后自动向 mq 回复接收到了，mq 接收到回复后会删除消息：设置为 false 则需要手动确认
                channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {
                });
            } catch (IOException | TimeoutException e) {
                e.printStackTrace();
            }
        });
    }
}